from datetime import datetime
import pyperclip
from cfg import CCfg


def list_2_set(input_str: str) -> set:
    """
    将输入的字符串转换为集合。
    先去除字符串中的空格，将类似']['的格式替换为正常的逗号分隔格式，再以逗号为分隔符分割字符串转换为集合。
    """
    input_str = input_str.replace("\r", "")
    input_str = input_str.replace("\n", "")
    input_str = input_str.replace(" ", "")
    input_str = input_str.replace("][", "],[")
    processed_str = input_str.split(",")
    result_set = set(processed_str)
    return result_set


def print_time(cfg_instance: CCfg):
    now = datetime.now()
    formatted_time = now.strftime('%Y-%m-%d %H:%M:%S.%f')[:-4]  # 获取包含微秒的时间格式并截取到100毫秒精度
    cfg_instance.print(formatted_time)


def find_not_participated(cfg_instance: CCfg):
    """
    根据给定的配置实例（CCfg类型），找出实际未参与活动的人员集合。
    主要通过对全部人员集合、被安排人员集合以及实际参与人员集合进行集合运算来判断。
    """
    print_time(cfg_instance)

    # 全部人员集合
    all_people_set = list_2_set(cfg_instance.GetAllPeople())
    cfg_instance.print("总人数：" + str(len(all_people_set)))

    # 被安排的人员集合
    scheduled_people_set = list_2_set(cfg_instance.GetScheduledPeople())
    cfg_instance.print("被安排的人数：" + str(len(scheduled_people_set)))

    # 实际参与活动的人员集合
    actual_participants_set = list_2_set(cfg_instance.GetActualParticipants())
    actual_participants_set = actual_participants_set & all_people_set
    cfg_instance.print("实际承伤+弩箭人数：" + str(len(actual_participants_set)))

    # 计算实际参与人员集合与被安排人员集合的交集大小（相关性）
    correlation_scheduled_word = len(actual_participants_set & scheduled_people_set)

    # 计算实际参与人员集合与“全部人员中除去被安排人员”集合的交集大小（相关性）
    not_scheduled = all_people_set - scheduled_people_set
    correlation_unscheduled_work = len(actual_participants_set & not_scheduled)

    # 根据相关性判断在哪个集合中找出实际未参与的人
    if correlation_scheduled_word > correlation_unscheduled_work:
        # 如果与被安排人员集合的相关性大于与“未被安排人员”集合的相关性，则在被安排人员集合中找未参与的人
        not_participated_people = scheduled_people_set - actual_participants_set
        run_around_people = actual_participants_set - scheduled_people_set
    else:
        # 反之，则在未被安排的人员集合中找出实际未参与活动的人
        not_participated_people = not_scheduled - actual_participants_set
        run_around_people = actual_participants_set - not_scheduled

    # 输出实际未参与活动的人
    cfg_instance.print("内鬼人数：" + str(len(not_participated_people)))
    cfg_instance.print("承伤内鬼：", end="")

    clipboard_data = "未承伤："
    for element in not_participated_people:
        cfg_instance.print(f"{element}, ", end="")
        clipboard_data = clipboard_data + element + ", "

    cfg_instance.print("\r\n")

    clipboard_data = clipboard_data + "乱跑被点弩箭："
    cfg_instance.print("乱跑的内鬼：", end="")
    for element in run_around_people:
        cfg_instance.print(f"{element}, ", end="")
        clipboard_data = clipboard_data + element + ", "

    pyperclip.copy(clipboard_data)


if __name__ == "__main__":
    cfg_instance = CCfg()
    cfg_instance.SetAllPeople(
        "[药丸淡惹·唯我独尊][我想吃米饭·唯我独尊][慕溪溪·长安城][言崽不是旺仔·唯我独尊][洛予溪·长安城][折隐于年·唯我独尊][非要和我情缘·唯我独尊][宋今昭·梦江南][王祖贤·天鹅坪][月中桂·唯我独尊][轻灵出月夜·唯我独尊][泥补药哇哇叫·梦江南][善蔬·唯我独尊][金雾·梦江南][雨落凝殇·唯我独尊][混子藏剑·梦江南][陈萍安·唯我独尊][摸鱼·眉间雪][柳清楷·乾坤一掷][你不是那谁吗·唯我独尊][海伞伞·唯我独尊][伽秋·唯我独尊]")
    cfg_instance.SetScheduledPeople(
        "[慕溪溪·长安城][雨落凝殇·唯我独尊][你不是那谁吗·唯我独尊][洛予溪·长安城][金雾·梦江南][非要和我情缘·唯我独尊][轻灵出月夜·唯我独尊][月中桂·唯我独尊][言崽不是旺仔·唯我独尊][摸鱼·眉间雪]")
    cfg_instance.SetActualParticipants(
        "[药丸淡惹·唯我独尊][折隐于年·唯我独尊][陆绫·天鹅坪][混子藏剑·梦江南][泥补药哇哇叫·梦江南][海伞伞·唯我独尊][我想吃米饭·唯我独尊][王祖贤·天鹅坪][陈萍安·唯我独尊][宋今昭·梦江南][海伞伞·唯我独尊][我想吃米饭·唯我独尊][伽秋·唯我独尊][柳清楷·乾坤一掷][善蔬·唯我独尊]")

    find_not_participated(cfg_instance)
